ì믞 ë¶ììì íì ê²ì¬ì íìì ìž ìí ì í구íê³ , ë€ìí íë¡ê·žëë° ìžìŽìì ìœë ì 뢰ì±ì 볎ì¥íê³ ì€ë¥ë¥Œ ë°©ì§íë ë°©ë²ì ììëŽ ëë€.
ì믞 ë¶ì: ê²¬ê³ í ìœë륌 ìí íì ê²ì¬ ì벜 íŽë¶
ì믞 ë¶ìì ìŽí ë¶ì ë° êµ¬ë¬ž ë¶ìì ìŽìŽì§ë 컎íìŒ ê³Œì ì ì€ìí ëšê³ì ëë€. ìŽë íë¡ê·žëšì 구조ì ìë¯žê° ìŒêŽëê³ íë¡ê·žëë° ìžìŽì ê·ì¹ì ì€ìíëì§ íìží©ëë€. ì믞 ë¶ìì ê°ì¥ ì€ìí 잡멎 ì€ íëë íì ê²ì¬(type checking)ì ëë€. ìŽ êžììë íì ê²ì¬ì ìžê³ë¥Œ ê¹ìŽ íê³ ë€ìŽ ê·ž 목ì , ë€ìí ì ê·Œ ë°©ì, ê·žëŠ¬ê³ ìíížìšìŽ ê°ë°ììì ì€ìì±ì í구í©ëë€.
íì ê²ì¬ë 묎ììžê°?
íì ê²ì¬ë íŒì°ì°ìì íì ìŽ ì¬ì©ëë ì°ì°ìì ížíëëì§ íìžíë ì ì íë¡ê·žëš ë¶ìì í ííì ëë€. ê°ëší ë§íŽ, ìžìŽì ê·ì¹ì ë°ëŒ ë°ìŽí°ë¥Œ ì¬ë°ë¥ž ë°©ììŒë¡ ì¬ì©íê³ ìëì§ íìžíë ê²ì ëë€. ì륌 ë€ìŽ, ëë¶ë¶ì ìžìŽììë ëª ìì ìž íì ë³í ììŽ ë¬žììŽê³Œ ì ì륌 ì§ì ëí ì ììµëë€. íì ê²ì¬ë ìœëê° ì€íëêž°ë ì ì ê°ë° 죌Ʞ ìŽêž°ì ìŽë¬í ì¢ ë¥ì ì€ë¥ë¥Œ í¬ì°©íë ê²ì 목íë¡ í©ëë€.
ë§ì¹ ìœëì ëí ë¬žë² ê²ì¬ì ê°ë€ê³ ìê°í ì ììµëë€. ë¬žë² ê²ì¬ê° 묞ì¥ì 묞ë²ì ì íì±ì 볎ì¥íë ê²ì²ëŒ, íì ê²ì¬ë ìœëê° ë°ìŽí° íì ì ì íšíê³ ìŒêŽë ë°©ììŒë¡ ì¬ì©íëë¡ ë³Žì¥í©ëë€.
íì ê²ì¬ë ì ì€ìíê°?
íì ê²ì¬ë ë€ì곌 ê°ì ëª ê°ì§ ì€ìí ìŽì ì ì ê³µí©ëë€:
- ì€ë¥ ê°ì§: íì êŽë š ì€ë¥ë¥Œ ì¡°êž°ì ìë³íì¬ ë°íì ì€ ìêž°ì¹ ìì ëì ë° ì¶©ëì ë°©ì§í©ëë€. ìŽë ëë²ê¹ ìê°ì ì ìœíê³ ìœë ì 뢰ì±ì í¥ììíµëë€.
- ìœë ìµì í: íì ì 볎ë 컎íìŒë¬ê° ìì±ë ìœë륌 ìµì ííë ë° ëìì ì€ëë€. ì륌 ë€ìŽ, ë³ìì ë°ìŽí° íì ì ì멎 컎íìŒë¬ë íŽë¹ ë³ìì ëí ì°ì°ì ìííêž° ìíŽ ê°ì¥ íšìšì ìž êž°ê³ ëª ë ¹ìŽë¥Œ ì íí ì ììµëë€.
- ìœë ê°ë ì± ë° ì ì§ë³Žìì±: ëª ìì ìž íì ì ìžì ìœë ê°ë ì±ì ëìŽê³ ë³ì ë° íšìì ìëë 목ì ì ë ìœê² ìŽíŽíëë¡ ë§ëëë€. ìŽë ê²°êµ ì ì§ë³Žìì±ì í¥ììí€ê³ ìœë ìì ì€ ì€ë¥ ë°ì ìíì ì€ì ëë€.
- 볎ì: íì ê²ì¬ë ë°ìŽí°ê° ìëë ë²ì ëŽìì ì¬ì©ëëë¡ ë³Žì¥íšìŒë¡ìš ë²íŒ ì€ë²íë¡ì ê°ì í¹ì ì íì 볎ì ì·šìœì ì ë°©ì§íë ë° ëììŽ ë ì ììµëë€.
íì ê²ì¬ì ì¢ ë¥
íì ê²ì¬ë í¬ê² ë ê°ì§ 죌ì ì íìŒë¡ ë¶ë¥í ì ììµëë€:
ì ì íì ê²ì¬
ì ì íì ê²ì¬ë 컎íìŒ íìì ìíë©ëë€. ìŠ, ë³ìì ííìì íì ìŽ íë¡ê·žëšìŽ ì€íëêž° ì ì ê²°ì ë©ëë€. ìŽë¥Œ íµíŽ íì ì€ë¥ë¥Œ ì¡°êž°ì ë°ê²¬íì¬ ë°íì ì€ì ë°ìíë ê²ì ë°©ì§í ì ììµëë€. Java, C++, C#, Haskell곌 ê°ì ìžìŽë ì ì íì ìžìŽì ëë€.
ì ì íì ê²ì¬ì ì¥ì :
- ì¡°êž° ì€ë¥ ê°ì§: ë°íì ì ì íì ì€ë¥ë¥Œ í¬ì°©íì¬ ë ì 뢰í ì ìë ìœë륌 ë§ëëë€.
- ì±ë¥: íì ì 볎ì êž°ë°í 컎íìŒ íì ìµì í륌 ê°ë¥íê² í©ëë€.
- ìœë ëª íì±: ëª ìì ìž íì ì ìžì ìœë ê°ë ì±ì í¥ììíµëë€.
ì ì íì ê²ì¬ì ëšì :
- ì격í ê·ì¹: ë ì íì ìŒ ì ììŒë©° ë ë§ì ëª ìì íì ì ìžì ì구í ì ììµëë€.
- ê°ë° ìê°: ëª ìì ìž íì ìŽë ží ìŽì ìŽ íìíêž° ë묞ì ê°ë° ìê°ìŽ ëìŽë ì ììµëë€.
ìì (Java):
int x = 10;
String y = "Hello";
// x = y; // 컎íìŒ íì ì€ë¥ ë°ì
ìŽ Java ìì ìì 컎íìŒë¬ë 묞ììŽ `y`륌 ì ì ë³ì `x`ì í ë¹íë €ë ìë륌 컎íìŒ ì€ì íì ì€ë¥ë¡ íìí©ëë€.
ëì íì ê²ì¬
ëì íì ê²ì¬ë ë°íìì ìíë©ëë€. ìŠ, ë³ìì ííìì íì ìŽ íë¡ê·žëšìŽ ì€íëë ëì ê²°ì ë©ëë€. ìŽë ìœëì ë ë§ì ì ì°ì±ì ì ê³µíì§ë§, íì ì€ë¥ê° ë°íìê¹ì§ ë°ê²¬ëì§ ìì ì ììì ì믞íêž°ë í©ëë€. Python, JavaScript, Ruby, PHPì ê°ì ìžìŽë ëì íì ìžìŽì ëë€.
ëì íì ê²ì¬ì ì¥ì :
- ì ì°ì±: ë ì ì°í ìœëì ë¹ ë¥ž íë¡í íìŽíì ê°ë¥íê² í©ëë€.
- ì ì ìì©êµ¬ ìœë: ëª ìì ìž íì ì ìžìŽ ë íìíì¬ ìœëì ì¥í©íšì ì€ì ëë€.
ëì íì ê²ì¬ì ëšì :
- ë°íì ì€ë¥: íì ì€ë¥ê° ë°íìê¹ì§ ë°ê²¬ëì§ ìì ì ììŽ ìêž°ì¹ ìì ì¶©ëë¡ ìŽìŽì§ ì ììµëë€.
- ì±ë¥: ì€í ì€ íì ê²ì¬ê° íìíêž° ë묞ì ë°íì ì€ë²í€ëê° ë°ìí ì ììµëë€.
ìì (Python):
x = 10
y = "Hello"
# x = y # ì€íë ëë§ ë°íì ì€ë¥ê° ë°ìíš
print(x + 5)
ìŽ Python ìì ìì `y`륌 `x`ì í ë¹íë ê²ì ìŠì ì€ë¥ë¥Œ ë°ììí€ì§ ììµëë€. ê·žë¬ë ëì€ì `x`ê° ì¬ì í ì ììž ê²ì²ëŒ ì°ì ì°ì°ì ìëí멎 (ì: í ë¹ í `print(x + 5)`), ë°íì ì€ë¥ê° ë°ìí©ëë€.
íì ìì€í
íì ìì€í ì ë³ì, ííì, íšìì ê°ì íë¡ê·žëë° ìžìŽ êµ¬ì± ììì íì ì í ë¹íë ê·ì¹ì ì§í©ì ëë€. ìŽë íì ìŽ ìŽë»ê² ê²°í©ëê³ ì¡°ìë ì ìëì§ë¥Œ ì ìíë©°, íì ê²ì¬êž°ê° íë¡ê·žëšìŽ íì ìì (type-safe)íì§ íìžíë ë° ì¬ì©ë©ëë€.
íì ìì€í ì ë€ìì í¬íší ì¬ë¬ ì°šìì ë°ëŒ ë¶ë¥ë ì ììµëë€:
- ê°íì (Strong Typing) vs. ìœíì (Weak Typing): ê°íì ì ìžìŽê° íì ê·ì¹ì ì격íê² ì ì©íì¬ ì€ë¥ë¡ ìŽìŽì§ ì ìë ììì íì ë³íì ë°©ì§íë ê²ì ì믞í©ëë€. ìœíì ì ë ë§ì ììì ë³íì íì©íì§ë§ ìœë륌 ì€ë¥ì ë ì·šìœíê² ë§ë€ ìë ììµëë€. Javaì Pythonì ìŒë°ì ìŒë¡ ê°íì ìŒë¡ ê°ì£Œëë ë°ë©Ž, Cì JavaScriptë ìœíì ìŒë¡ ê°ì£Œë©ëë€. ê·žë¬ë "ê°íì "곌 "ìœíì "ìŽëŒë ì©ìŽë ì¢ ì¢ ë¶ì ííê² ì¬ì©ëë¯ë¡, íì ìì€í ì ëí ë 믞ë¬í ìŽíŽê° ìŒë°ì ìŒë¡ ì ížë©ëë€.
- ì ì íìŽí vs. ëì íìŽí: ìì ë Œìíë¯ìŽ, ì ì íìŽíì 컎íìŒ íìì íì ê²ì¬ë¥Œ ìííê³ , ëì íìŽíì ë°íìì ìíí©ëë€.
- ëª ìì íìŽí vs. ììì íìŽí: ëª ìì íìŽíì íë¡ê·žëëšžê° ë³ìì íšìì íì ì ëª ìì ìŒë¡ ì ìžíëë¡ ì구í©ëë€. ììì íìŽíì 컎íìŒë¬ë ìží°í늬í°ê° ì¬ì©ëë 컚í ì€ížë¥Œ êž°ë°ìŒë¡ íì ì ì¶ë¡ í ì ìëë¡ í©ëë€. Java(ìµì ë²ì ì `var` í€ìë)ì C++ë ëª ìì íìŽí ìžìŽì ììŽë©°(ìŽë ì ëì íì ì¶ë¡ ë ì§ìíì§ë§), Haskellì ê°ë ¥í íì ì¶ë¡ ì ê°ì§ ìžìŽì ëíì ìž ìì ëë€.
- ìŽëŠ êž°ë° íìŽí(Nominal Typing) vs. 구조 êž°ë° íìŽí(Structural Typing): ìŽëŠ êž°ë° íìŽíì íì ì ìŽëŠìŒë¡ ë¹êµí©ëë€(ì: ê°ì ìŽëŠì ê°ì§ ë íŽëì€ë ê°ì íì ìŒë¡ ê°ì£Œ). 구조 êž°ë° íìŽíì íì ì êµ¬ì¡°ë¡ ë¹êµí©ëë€(ì: ê°ì íëì ë©ìë륌 ê°ì§ ë íŽëì€ë ìŽëŠì ìêŽììŽ ê°ì íì ìŒë¡ ê°ì£Œ). Javaë ìŽëŠ êž°ë° íìŽíì ì¬ì©íê³ Goë 구조 êž°ë° íìŽíì ì¬ì©í©ëë€.
ìŒë°ì ìž íì ê²ì¬ ì€ë¥
íë¡ê·žëëšžê° ë§ì£Œì¹ ì ìë ìŒë°ì ìž íì ê²ì¬ ì€ë¥ë ë€ì곌 ê°ìµëë€:
- íì ë¶ìŒì¹: ížíëì§ ìë íì ì íŒì°ì°ìì ì°ì°ìê° ì ì©ë ë ë°ìí©ëë€. ì륌 ë€ìŽ, 묞ììŽì ì ì륌 ëíë €ê³ ìëíë 겜ì°ì ëë€.
- ì ìžëì§ ìì ë³ì: ë³ìê° ì ìžëì§ ìê³ ì¬ì©ëê±°ë, ê·ž íì ìŽ ìë €ì§ì§ ììì ë ë°ìí©ëë€.
- íšì ìžì ë¶ìŒì¹: íšìê° ì못ë íì ì ìžìë ì못ë ìì ìžìë¡ ížì¶ë ë ë°ìí©ëë€.
- ë°í íì ë¶ìŒì¹: íšìê° ì ìžë ë°í íì 곌 ë€ë¥ž íì ì ê°ì ë°íí ë ë°ìí©ëë€.
- ë í¬ìží° ìì°žì¡°: ë í¬ìží°ì ë©€ë²ì ì ê·Œíë €ê³ ìëí ë ë°ìí©ëë€. (ì ì íì ìì€í ì ê°ì§ ìŒë¶ ìžìŽë 컎íìŒ íìì ìŽë¬í ì¢ ë¥ì ì€ë¥ë¥Œ ë°©ì§íë €ê³ ìëí©ëë€.)
ë€ìí ìžìŽììì ìì
ëª ê°ì§ ë€ë¥ž íë¡ê·žëë° ìžìŽìì íì ê²ì¬ê° ìŽë»ê² ìëíëì§ ìŽíŽë³Žê² ìµëë€:
Java (ì ì , ê°íì , ìŽëŠ êž°ë°)
Javaë ì ì íì ìžìŽë¡, íì ê²ì¬ê° 컎íìŒ íìì ìíë©ëë€. ëí íì ê·ì¹ì ì격íê² ì ì©íë ê°íì ìžìŽì ëë€. Javaë ìŽëŠ êž°ë° íìŽíì ì¬ì©íì¬ ìŽëŠì êž°ë°ìŒë¡ íì ì ë¹êµí©ëë€.
public class TypeExample {
public static void main(String[] args) {
int x = 10;
String y = "Hello";
// x = y; // 컎íìŒ íì ì€ë¥: ížíëì§ ìë íì
: Stringì intë¡ ë³íë ì ììµëë€
System.out.println(x + 5);
}
}
Python (ëì , ê°íì , 구조 êž°ë°(ëë¶ë¶))
Pythonì ëì íì ìžìŽë¡, íì ê²ì¬ê° ë°íìì ìíë©ëë€. ìŒë¶ ììì ë³íì íì©íì§ë§ ìŒë°ì ìŒë¡ ê°íì ìžìŽë¡ ê°ì£Œë©ëë€. Pythonì 구조 êž°ë° íìŽíì ê°ê¹ì§ë§ ììíê² êµ¬ì¡°ì ìŽì§ë ììµëë€. ë íìŽí(Duck typing)ì Python곌 ì죌 ì°êŽëë êŽë š ê°ë ì ëë€.
x = 10
y = "Hello"
# x = y # ìŽ ìì ììë ì€ë¥ ìì
# print(x + 5) # y륌 xì í ë¹íêž° ì ìë 묞ì ìì
#print(x + 5) #TypeError: +: 'str'ì 'int'ì ëíŽ ì§ìëì§ ìë íŒì°ì°ì íì
ì
ëë€
JavaScript (ëì , ìœíì , ìŽëŠ êž°ë°)
JavaScriptë ìœíì ì ê°ì§ ëì íì ìžìŽì ëë€. íì ë³íìŽ ììì ìŽê³ 공격ì ìŒë¡ ë°ìí©ëë€. JavaScriptë ìŽëŠ êž°ë° íìŽíì ì¬ì©í©ëë€.
let x = 10;
let y = "Hello";
x = y;
console.log(x + 5); // JavaScriptê° 5륌 묞ììŽë¡ ë³ííêž° ë묞ì "Hello5"륌 ì¶ë ¥í©ëë€.
Go (ì ì , ê°íì , 구조 êž°ë°)
Goë ê°íì ì ê°ì§ ì ì íì ìžìŽì ëë€. 구조 êž°ë° íìŽíì ì¬ì©íì¬, íì ìŽ ìŽëŠì ìêŽììŽ ëìŒí íëì ë©ìë륌 ê°ì§ë©Ž ëë±í ê²ìŒë¡ ê°ì£Œë©ëë€. ìŽë Go ìœë륌 ë§€ì° ì ì°íê² ë§ëëë€.
package main
import "fmt"
// íë륌 ê°ì§ íì
ì ì
type Person struct {
Name string
}
// ëìŒí íë륌 ê°ì§ ë€ë¥ž íì
ì ì
type User struct {
Name string
}
func main() {
person := Person{Name: "Alice"}
user := User{Name: "Bob"}
// êµ¬ì¡°ê° ê°êž° ë묞ì Personì Userì í ë¹
user = User(person)
fmt.Println(user.Name)
}
íì ì¶ë¡
íì ì¶ë¡ ì 컎íìŒë¬ë ìží°í늬í°ê° ííìì 컚í ì€ížë¥Œ êž°ë°ìŒë¡ íì ì ìëìŒë¡ ì¶ë¡ íë ë¥ë ¥ì ëë€. ìŽë ëª ìì ìž íì ì ìžì íìì±ì ì€ì¬ ìœë륌 ë ê°ê²°íê³ ê°ë ì± ìê² ë§ëëë€. Java(`var` í€ìë ì¬ì©), C++(`auto` ì¬ì©), Haskell, Scala륌 í¬íší ë§ì íë ìžìŽë€ìŽ ë€ìí ìì€ìŒë¡ íì ì¶ë¡ ì ì§ìí©ëë€.
ìì (Java `var` ì¬ì©):
var message = "Hello, World!"; // 컎íìŒë¬ê° messageê° StringìŽëŒê³ ì¶ë¡ í©ëë€
var number = 42; // 컎íìŒë¬ê° numberê° intëŒê³ ì¶ë¡ í©ëë€
ê³ êž íì ìì€í
ìŒë¶ íë¡ê·žëë° ìžìŽë íšì¬ ë í° ìì ì±ê³Œ ííë ¥ì ì ê³µíêž° ìíŽ ë ê³ êž íì ìì€í ì ì¬ì©í©ëë€. ì¬êž°ìë ë€ììŽ í¬íšë©ëë€:
- ì졎 íì (Dependent Types): ê°ì ì졎íë íì ì ëë€. ìŽë¥Œ íµíŽ íšìê° ìëí ì ìë ë°ìŽí°ì ëíŽ ë§€ì° ì ë°í ì ìœ ì¡°ê±Žì ííí ì ììµëë€.
- ì ë€ëŠ(Generics): ê° íì
ì ëíŽ ë€ì ìì±í íì ììŽ ì¬ë¬ íì
곌 íšê» ìëí ì ìë ìœë륌 ìì±í ì ìê² íŽì€ëë€. (ì: Javaì `List
`). - ëìì ë°ìŽí° íì (Algebraic Data Types): í© íì (Sum types) ë° ê³± íì (Product types)곌 ê°ìŽ ë€ë¥ž ë°ìŽí° íì ìŒë¡ 구ì±ë ë°ìŽí° íì ì 구조íë ë°©ììŒë¡ ì ìí ì ìê² íŽì€ëë€.
íì ê²ì¬ë¥Œ ìí ëªšë² ì¬ë¡
ìœëê° íì ìì íê³ ì 뢰í ì ìëë¡ ë°ë¥Œ ì ìë ëª ê°ì§ ëªšë² ì¬ë¡ë ë€ì곌 ê°ìµëë€:
- ì¬ë°ë¥ž ìžìŽ ì í: ë¹ë©Ží ìì ì ì í©í íì ìì€í ì ê°ì¶ íë¡ê·žëë° ìžìŽë¥Œ ì ííììì€. ì 뢰ì±ìŽ ê°ì¥ ì€ìí íµì¬ ì í늬ìŒìŽì ì ê²œì° ì ì íì ìžìŽê° ì ížë ì ììµëë€.
- ëª ìì íì ì ìž ì¬ì©: íì ì¶ë¡ êž°ë¥ìŽ ìë ìžìŽììë ìœë ê°ë ì±ì ëìŽê³ ìêž°ì¹ ìì ëìì ë°©ì§íêž° ìíŽ ëª ìì íì ì ìžì ì¬ì©íë ê²ì ê³ ë €íììì€.
- ëšì í ì€íž ìì±: ìœëê° ë€ìí íì ì ë°ìŽí°ë¡ ì¬ë°ë¥Žê² ìëíëì§ íìžíêž° ìíŽ ëšì í ì€ížë¥Œ ìì±íììì€.
- ì ì ë¶ì ë구 ì¬ì©: ì ì ë¶ì ë구륌 ì¬ì©íì¬ ì ì¬ì ìž íì ì€ë¥ ë° êž°í ìœë íì§ ë¬žì 륌 ê°ì§íììì€.
- íì ìì€í ìŽíŽ: ì¬ì©íê³ ìë íë¡ê·žëë° ìžìŽì íì ìì€í ì ìŽíŽíë ë° ìê°ì í¬ìíììì€.
ê²°ë¡
íì ê²ì¬ë ìœë ì 뢰ì±ì 볎ì¥íê³ , ì€ë¥ë¥Œ ë°©ì§íë©°, ì±ë¥ì ìµì ííë ë° ì€ìí ìí ì íë ì믞 ë¶ìì íìì ìž ìž¡ë©Žì ëë€. ë€ìí ì¢ ë¥ì íì ê²ì¬, íì ìì€í , ëªšë² ì¬ë¡ë¥Œ ìŽíŽíë ê²ì 몚ë ìíížìšìŽ ê°ë°ììê² íìì ì ëë€. ê°ë° ìí¬íë¡ì°ì íì ê²ì¬ë¥Œ íµí©íšìŒë¡ìš ë ê²¬ê³ íê³ , ì ì§ë³Žìíêž° ì¬ì°ë©°, ìì í ìœë륌 ìì±í ì ììµëë€. Javaì ê°ì ì ì íì ìžìŽë¡ ìì íë Python곌 ê°ì ëì íì ìžìŽë¡ ìì íë , íì ê²ì¬ ìì¹ì ëí íì€í ìŽíŽë íë¡ê·žëë° êž°ì 곌 ìíížìšìŽì íì§ì í¬ê² í¥ììí¬ ê²ì ëë€.